home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
libg_261.zip
/
libg_261
/
libg++
/
etc
/
graph
/
read_data.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
3KB
|
115 lines
#include "read_data.h"
// READ_DATA reads ascii (or binary) data from an istream of
// coordinates and labels. It passes back the array of points (x, y,
// and label) containing the data.
void
read_data (istream& in, char* in_filename, pointXPlex &pplex,
int auto_abscissa, double x_start,
double delta_x, int &symbol_number,
data_type input_data, int switch_symbols)
{
char next_char; // next character to be read
point p; // the point we are currently reading in.
p.label = (char *) 0; // binary files contain no labels.
double prev_x = -DBL_MAX; // the previous x value.
if (auto_abscissa)
x_start -= delta_x;
if (input_data == ASCII)
{ // input contains ascii data
while (in.good ())
{
if (auto_abscissa)
p.x = x_start = x_start + delta_x;
else
in >> p.x >> WS;
if (switch_symbols && (p.x < prev_x))
symbol_number++;
prev_x = p.x;
in >> p.y;
if (!in.good ()) // if we read x but not y complain.
{
char *input_line;
in.clear ();
in.gets (&input_line);
// if the input contains one coordinate per line
// you win here --- emacs can find the source
// line from this error message.
cerr << in_filename << ":" << 2 + pplex.high()
<< ": unable to read the" sp 2 + pplex.high()
<< ((2 + pplex.high() == 1) ? "st" : "th")
<< " y coordiate.\n";
if (input_line)
if (strlen (input_line))
cerr << in_filename << ":" << 2 + pplex.high()
<< ": unexpected `" << input_line << "'\n";
break;
}
in >> WS; // skip white space after y coordinate
p.label = (char *) 0; // by default there is no label
in.get (next_char); // look ahead for a label
if (in.good ())
{
in.putback (next_char);
if (!isdigit (next_char) // if a lable is found
&& (next_char != '.')
&& (next_char != '+')
&& (next_char != '-'))
{
in.gets (&p.label); // store it with x and y
}
in >> WS; // skip white space after label
}
p.symbol = symbol_number;
pplex.add_high (p);
}
return;
}
if (input_data == DOUBLE)
{ // input contains binary double precision
while (in.good ())
{
if (auto_abscissa)
p.x = x_start = x_start + delta_x;
else
{
in.read (&p.x, sizeof(p.x));
if (switch_symbols && (p.x < prev_x))
symbol_number++;
prev_x = p.x;
}
in.read (&p.y, sizeof(p.y));
p.symbol = symbol_number;
if (in.good ())
pplex.add_high (p);
}
}
if (input_data == INT)
{ // input contains binary integers
int i;
while (in.good ())
{
if (auto_abscissa)
p.x = x_start = x_start + delta_x;
else
{
in.read (&i, sizeof(i));
p.x = i;
if (switch_symbols && (p.x < prev_x))
symbol_number++;
prev_x = p.x;
}
in.read (&p.y, sizeof(p.y));
p.symbol = symbol_number;
if (in.good ())
pplex.add_high (p);
}
}
return;
}